gl renderer: Set the render region as initial clip
authorTimm Bäder <mail@baedert.org>
Sun, 2 Dec 2018 05:56:52 +0000 (06:56 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 2 Dec 2018 12:25:43 +0000 (13:25 +0100)
So we avoid creating render ops for things outside of it.

gsk/gl/gskglrenderer.c

index c92b71b0f2345d1f59d5774c8ea02e6bb1199b91..b7c7ebdc7d2951ed3a0a4b5a62e9dd501997fa94 100644 (file)
@@ -2622,8 +2622,27 @@ gsk_gl_renderer_do_render (GskRenderer           *renderer,
   render_op_builder.current_viewport = *viewport;
   render_op_builder.current_opacity = 1.0f;
   render_op_builder.render_ops = self->render_ops;
-  gsk_rounded_rect_init_from_rect (&render_op_builder.current_clip, viewport, 0.0f);
   ops_push_modelview (&render_op_builder, &modelview);
+  /* Initial clip is self->render_region! */
+  if (self->render_region != NULL)
+    {
+      cairo_rectangle_int_t render_extents;
+
+      cairo_region_get_extents (self->render_region, &render_extents);
+      render_op_builder.current_clip = GSK_ROUNDED_RECT_INIT (render_extents.x,
+                                                              render_extents.y,
+                                                              render_extents.width,
+                                                              render_extents.height);
+
+      ops_transform_bounds_modelview (&render_op_builder,
+                                      &render_op_builder.current_clip.bounds,
+                                      &render_op_builder.current_clip.bounds);
+    }
+  else
+    {
+      gsk_rounded_rect_init_from_rect (&render_op_builder.current_clip, viewport, 0.0f);
+    }
+
 
   if (fbo_id != 0)
     ops_set_render_target (&render_op_builder, fbo_id);